Przykad 6.1. Realizacja przeszukiwania w gb
#include "dfs.h"

// Odwied wierzchoek u w grafie i uaktualnij informacj
void dfs_visit (Graph const &graph, int u,                      /* we */
                vector<int> &d, vector<int> &f,                 /* wy */
                vector<int> &pred, vector<vertexColor> &color,  /* wy */
                int &ctr, list<EdgeLabel> &labels) {            /* wy */
   color[u] = Gray;  // szary
   d[u] = ++ctr;

   // Przetwrz wszystkich ssiadw u
   for (VertexList::const_iterator ci = graph.begin(u);
        ci != graph.end(u); ++ci) {
      int v = ci->first;

   // Oblicz edgeType i dodaj do etykietowania. Domylnie  poprzeczne
   edgeType type = Cross;
   if (color[v] == White) { type = Tree; }
   else if (color[v] == Gray) {type = Backward; }
   else { if (d[u] < d[v]) type = Forward; }
   labels.push_back(EdgeLabel(u, v, type));

   // Natychmiast zbadaj nie odwiedzone wierzchoki i zapisz pred[].
   // Po zakoczeniu rekurencyjnego wywoania nawr do przylegych
   // wierzchokw
   if (color[v] == White) {  // biay
      pred[v] = u;
      dfs_visit(graph, v, d, f, pred, color, ctr, labels);
      }
   }

   color[u] = Black  // czarny; ssiedzi obsueni i my rwnie
   f[u] = ++ctr;
}

/**
 * Wykonaj przeszukanie w gb, zaczynajc od wierzchoka s, i oblicz
 * wartoci d[u] (gdy wierzchoek u by napotkany po raz pierwszy), f[u]
 * (gdy wszystkie wierzchoki ssiadujce z u zostay przetworzone),
 * pred[u] (poprzednik u w lesie przeszukiwania w gb)
 * oraz poetykietuj krawdzie stosownie do ich typw.
 */
void dfs_search(Graph const &graph, int s,                       /* we */
                vector<int> &d, vector<int> &f,                  /* wy */
                vector<int> &pred, list<EdgeLabel> &labels)      /* wy */
{
   // Zainicjuj tablice d[], f[] i pred[]. Oznacz wszystkie wierzchoki
   // na biao, jako nie odwiedzone. Wyczy etykiety krawdzi
   int ctr = 0;
   const int n = graph.numVertices();
   vector<vertexColor> color (n, White);
   d.assign(n, -1);
   f.assign(n, -1);
   pred.assign(n, -1);
   label.clear();

   // Przeszukaj, zaczynajc od wierzchoka rdowego; potem odwied
   // kady nie odwiedzony wierzchoek
   dfs_visit(graph, s, d, f, pred, color, ctr, labels);
   for (int u = 0; u < n; u++) {
      if (color[u] == White) {
         dfs_visit(graph, u, d, f, pred, color, ctr, labels);
      }
   }
}
